home *** CD-ROM | disk | FTP | other *** search
/ PC World 2008 September / PCWorld_2008-09_cd.bin / v cisle / sadanastroju / IE7proSetup_2.3.exe / plugins / searchstatus / plugin.js
Text File  |  2007-11-20  |  9KB  |  353 lines

  1. // ==UserScript==
  2. // @name          Alexa rank/google pagerank
  3. // @namespace     http://iescripts.org
  4. // @description      Display the website' Alexa and Google Page Rank. (Thanks to SearchStatus of FireFox)
  5. // @statussize    160
  6. // ==/UserScript==
  7.  
  8. (function()
  9.  {
  10.  var plugin = PRO_plugin(@name);
  11.  plugin.onpagechange = handlePageChange;
  12.  plugin.registerContextMenu("Show Google results from this site", menuShowGoogleResult);
  13.  plugin.registerContextMenu("Show Google Related Site", menuShowGoogleRelated);
  14.  plugin.registerContextMenu("Show Alexa Overview", menuShowAlexaOverview);
  15.  plugin.registerContextMenu("Show Alexa Traffic Detail", menuShowAlexaTraffic);
  16.  
  17.  var gCookie = "";
  18.  var gAlexaRank = "";
  19.  var gGoogleRank = "";
  20.  
  21.  var reqObj = new Object();
  22.  reqObj.request = function(callback, cookie, url, userAgent, lastModify) {
  23.  var req;
  24.  req = PRO_xmlhttpRequest();
  25.  req.onreadystatechange = function() {
  26.  if (req.readyState == 4) {// completed
  27.  if (req.status < 400) {// only if "OK"
  28.  try {
  29.      callback(true, req, cookie);
  30.  } catch(err) {
  31.  }
  32.  } else {
  33.      // PRO_log("There was a problem loading data :\n" + req.status+ "/" + req.statusText);
  34.      callback(false, req, cookie);
  35.  }
  36.  setTimeout(function() {req.forceClean();req = null;}, 1000);
  37.  }
  38.  }
  39.  try {
  40.      req.open("GET", url);
  41.      req.setRequestHeader( "User-Agent", userAgent);
  42.      if(lastModify.length > 0)
  43.          req.setRequestHeader( "If-Modified-Since", lastModify);
  44.      req.send(null);
  45.  
  46.  } catch(err){ 
  47.  }
  48.  return req;
  49.  }
  50.  
  51.  // escape the url
  52.  function encodeURL(url)
  53.  {
  54.      return escape(url).replace(/\+/g, '%2B').replace(/\"/g, '%22').replace(/\'/g, '%27');
  55.  }
  56.  
  57.  function menuShowGoogleResult(cookie,url) {
  58.      PRO_openInTab("http://google.com/search?&q=site:"+url,1);
  59.  }
  60.  
  61.  function menuShowGoogleRelated(cookie,url) {
  62.      PRO_openInTab("http://www.google.com/search?q=related:"+url,1);
  63.  }
  64.  
  65.  function menuShowAlexaOverview(cookie,url) {
  66.      var urlhost = url.split("/");
  67.      var qhost = urlhost[2];
  68.      PRO_openInTab("http://www.alexa.com/data/details/main?q=&url="+qhost,1);
  69.  }
  70.  
  71.  function menuShowAlexaTraffic(cookie,url) {
  72.      var urlhost = url.split("/");
  73.      var qhost = urlhost[2];
  74.      PRO_openInTab("http://www.alexa.com/data/details/traffic_details?q=&url="+qhost,1);
  75.  }
  76.  
  77.  
  78.  function handlePageChange(cookie, url, state) {
  79.      if(state == 1) {// page loading
  80.          var re = /http:\/\/(.*)/i;
  81.          var urlhost = url.split("/");
  82.  
  83.          var qhost = urlhost[2];
  84.          gCookie = cookie;
  85.          gAlexaRank = "";
  86.          gGoogleRank = "";
  87.          var encodeurl = encodeURL(qhost);
  88.          var queryurl = "http://xml.alexa.com/data?cli=10&dat=nsa&ver=quirk-searchstatus&uid=20060101000000&userip=126.12.3.4&url=" + encodeurl;
  89.          reqObj.request(processAlexaData, cookie, queryurl, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322; Alexa Toolbar)", "Thu, 26 Aug 2002 08:24:16 GMT");
  90.  
  91.          var encodeurl2 = encodeURL(url);
  92.          var reqgr = "info:" + url;
  93.          var reqgre = "info:" + encodeurl2.replace( "_", "%5F" );
  94.          var gGoogleCHCalc = new googlechcalc();  
  95.          var mGoogleCH = gGoogleCHCalc.googleCH( gGoogleCHCalc.strord( reqgr ) );
  96.          mGoogleCH = "6" + gGoogleCHCalc.googleNewCh( mGoogleCH );
  97.          queryurl = "http://toolbarqueries.google.com/search?client=navclient-auto&ch=" + mGoogleCH + "&ie=UTF-8&oe=UTF-8&features=Rank&q=" + reqgre;
  98.          // PRO_log(queryurl);
  99.          reqObj.request(processGoogleData, cookie, queryurl, "User-Agent", "Mozilla/4.0 (compatible; GoogleToolbar 2.0.114-big; Windows XP 5.1)");
  100.  
  101.      } else if(state == 2) {// page loaded
  102.      }
  103.  }
  104.  
  105.  function processAlexaData(isOK, req, cookie) {
  106.      if(gCookie == cookie) {
  107.         gAlexaRank = "0";
  108.          if(isOK) {
  109.             try {
  110.                 var re = /POPULARITY.*TEXT=\"(\d+)\"\/\>/i;
  111.                 var alexaRank = req.responseText.match(re);
  112.                 gAlexaRank = alexaRank[1];
  113.             } catch(e) {}
  114.          }
  115.          if(gGoogleRank.length > 0) {
  116.              processResult();
  117.          }
  118.      }
  119.  }
  120.  
  121.  function processGoogleData(isOK, req, cookie) {
  122.     if(gCookie == cookie) {
  123.         gGoogleRank = "0";
  124.          if(isOK) {
  125.             try {
  126.                  var re = /Rank_.*?:.*?:(\d+)/i;
  127.                  var googleRank = req.responseText.match(re);
  128.                  gGoogleRank = googleRank[1];
  129.             } catch(e) {}
  130.          }
  131.          if(gAlexaRank.length > 0) {
  132.              processResult();
  133.          }
  134.      }
  135.  }
  136.  
  137.  function processResult()
  138.  {
  139.     plugin.setStatusInfo("", "Alexa:"+FormatInteger(gAlexaRank)+"  Google:" + gGoogleRank + "/10", "", gCookie);
  140.  }
  141.  
  142.  function googlechcalc() {
  143.      return this; 
  144.  }
  145.  
  146.  googlechcalc.prototype =
  147.  {
  148. googleNewCh: function( ch )
  149.          {
  150.              ch = ( ( ( ch / 7 ) << 2 ) | ( ( this.myfmod( ch,13 ) ) & 7 ) );
  151.  
  152.              prbuf = new Array();
  153.              prbuf[0] = ch;
  154.              for( i = 1; i < 20; i++ ) 
  155.              {
  156.                  prbuf[i] = prbuf[i-1] - 9;
  157.              }
  158.              ch = this.googleCH( this.c32to8bit( prbuf ), 80 );
  159.  
  160.              return ch;        
  161.          },
  162.  
  163. googleCH: function( url ) 
  164.       {
  165.           var init = 0xE6359A60;
  166.  
  167.           var length = url.length;
  168.  
  169.           var a = 0x9E3779B9;
  170.           var b = 0x9E3779B9;
  171.           var c = 0xE6359A60;
  172.           var k = 0;
  173.           var len = length;
  174.           var mixo = new Array(); 
  175.  
  176.           while( len >= 12 ) 
  177.           {
  178.               a += (url[k+0] +(url[k+1]<<8) +(url[k+2]<<16) +(url[k+3]<<24));
  179.               b += (url[k+4] +(url[k+5]<<8) +(url[k+6]<<16) +(url[k+7]<<24));
  180.               c += (url[k+8] +(url[k+9]<<8) +(url[k+10]<<16)+(url[k+11]<<24));
  181.               mixo = this.mix(a,b,c);
  182.               a = mixo[0]; b = mixo[1]; c = mixo[2];
  183.               k += 12;
  184.               len -= 12;
  185.           }
  186.  
  187.           c += length;
  188.  
  189.           switch( len ) 
  190.           {
  191.               case 11:
  192.                   c += url[k+10]<<24;
  193.  
  194.               case 10: 
  195.                   c+=url[k+9]<<16;
  196.  
  197.               case 9 : 
  198.                   c+=url[k+8]<<8;
  199.  
  200.               case 8 : 
  201.                   b+=(url[k+7]<<24);
  202.  
  203.               case 7 : 
  204.                   b+=(url[k+6]<<16);
  205.  
  206.               case 6 : 
  207.                   b+=(url[k+5]<<8);
  208.  
  209.               case 5 : 
  210.                   b+=(url[k+4]);
  211.  
  212.               case 4 : 
  213.                   a+=(url[k+3]<<24);
  214.  
  215.               case 3 : 
  216.                   a+=(url[k+2]<<16);
  217.  
  218.               case 2 : 
  219.                   a+=(url[k+1]<<8);
  220.  
  221.               case 1 : 
  222.                   a+=(url[k+0]);
  223.           }
  224.  
  225.           mixo = this.mix( a, b, c );
  226.  
  227.           if( mixo[2] < 0 )
  228.           {
  229.               return ( 0x100000000 + mixo[2] );
  230.           }
  231.           else
  232.           {
  233.               return mixo[2];
  234.           }
  235.       },
  236.  
  237. hexdec: function( str )
  238.     {
  239.         return parseInt( str, 16 );
  240.     },
  241.  
  242. zeroFill: function( a, b )
  243.       {
  244.           var z = this.hexdec( 80000000 );
  245.  
  246.           if( z & a )
  247.           {
  248.               a = a >> 1;
  249.               a &= ~z;
  250.               a |= 0x40000000;
  251.               a = a >> ( b - 1 );
  252.           } 
  253.           else
  254.           {
  255.               a = a >> b;
  256.           }
  257.  
  258.           return (a);
  259.       },
  260.  
  261. mix: function( a, b, c ) 
  262.      {
  263.          a -= b; a -= c; a ^= ( this.zeroFill( c, 13 ) );
  264.          b -= c; b -= a; b ^= ( a << 8 );
  265.          c -= a; c -= b; c ^= ( this.zeroFill( b, 13 ) );
  266.          a -= b; a -= c; a ^= ( this.zeroFill( c, 12 ) );
  267.          b -= c; b -= a; b ^= ( a << 16);
  268.          c -= a; c -= b; c ^= ( this.zeroFill( b, 5 ) );
  269.          a -= b; a -= c; a ^= ( this.zeroFill( c, 3 ) ); 
  270.          b -= c; b -= a; b ^= ( a << 10);
  271.          c -= a; c -= b; c ^= ( this.zeroFill( b, 15 ) );
  272.  
  273.          var ret = new Array( (a), (b), (c) );
  274.  
  275.          return ret;
  276.      },
  277.  
  278. strord: function( string ) 
  279.     {
  280.         var result = new Array();
  281.  
  282.         for( i = 0; i < string.length; i++ ) 
  283.         {
  284.             result[i] = string.charCodeAt( i);    
  285.         }
  286.  
  287.         return result;
  288.     },
  289.  
  290. c32to8bit: function( arr32 ) 
  291.        {
  292.            var arr8 = new Array();    
  293.  
  294.            for( i = 0; i < arr32.length; i++ ) 
  295.            {
  296.                for( bitOrder = i * 4; bitOrder <= i * 4 + 3; bitOrder++ ) 
  297.                {
  298.                    arr8[bitOrder] = arr32[i] & 255;
  299.                    arr32[i] = this.zeroFill( arr32[i], 8 );
  300.                }
  301.            }
  302.  
  303.            return arr8;
  304.        },
  305.  
  306. myfmod: function( x, y )
  307.     {
  308.         var i = Math.floor( x / y );
  309.         return ( x - i * y );
  310.     }
  311.  };
  312.  function FormatInteger( integer )
  313.  {
  314.      var pattern = "###,###,###,###";
  315.      var result = '';
  316.  
  317.      integerIndex = integer.length - 1;
  318.      patternIndex = pattern.length - 1;
  319.  
  320.      while( ( integerIndex >= 0 ) && ( patternIndex >= 0 ) )
  321.      {
  322.          var digit = integer.charAt( integerIndex );
  323.          integerIndex--;
  324.  
  325.          // Skip non-digits from the source integer (eradicate current formatting).
  326.          if( ( digit < '0' ) || ( digit > '9') )  continue;
  327.  
  328.          // Got a digit from the integer, now plug it into the pattern.
  329.          while( patternIndex >= 0 )
  330.          {
  331.              var patternChar = pattern.charAt( patternIndex );
  332.              patternIndex--;
  333.  
  334.              // Substitute digits for '#' chars, treat other chars literally.
  335.              if( patternChar == '#' )
  336.              {
  337.                  result = digit + result;
  338.                  break;
  339.              }
  340.              else
  341.              {
  342.                  result = patternChar + result;
  343.              }
  344.          }
  345.      }
  346.  
  347.      return result;
  348.  }
  349.  }
  350. )();
  351.  
  352.  
  353.